﻿namespace Trancity
{
    using Common;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    using System;
    using System.Drawing;

    public class Светофор : MeshObject, MeshObject.IFromFile, IMatrixObject
    {
        public Стрелки жёлтая_стрелка;
        public Стрелки зелёная_стрелка;
        public Стрелки красная_стрелка;
        public Положение положение;
        public bool стрелка;

        public override void CreateMesh()
        {
            base.CreateMesh();
            if ((base._meshTextures != null) && (base._meshTextures.Length >= 4))
            {
                if (this.красная_стрелка != Стрелки.нет)
                {
                    base.LoadTexture(1, "стрелка_" + this.красная_стрелка.ToString() + ".png");
                }
                if (this.жёлтая_стрелка != Стрелки.нет)
                {
                    base.LoadTexture(2, "стрелка_" + this.жёлтая_стрелка.ToString() + ".png");
                }
                if (this.зелёная_стрелка != Стрелки.нет)
                {
                    base.LoadTexture(3, "стрелка_" + this.зелёная_стрелка.ToString() + ".png");
                }
            }
            else if (((base._meshTextures != null) && (base._meshTextures.Length >= 2)) && (this.зелёная_стрелка != Стрелки.нет))
            {
                base.LoadTexture(1, "стрелка_" + this.зелёная_стрелка.ToString() + ".png");
            }
        }

        public Matrix GetMatrix(int index)
        {
            DoublePoint point = this.положение.Координаты.xz_point;
            return (Matrix.RotationY(-((float) this.положение.Направление)) * Matrix.Translation((float) point.x, 0f, (float) point.y));
        }

        public void Обновить_материалы(bool нужен_зелёный, bool нужен_жёлтый, bool нужен_красный)
        {
            if ((this.стрелка && (base._meshMaterials != null)) && (base._meshMaterials.Length >= 2))
            {
                ColorValue emissiveColor = base._meshMaterials[1].EmissiveColor;
                if (нужен_зелёный && (emissiveColor.Green < 1f))
                {
                    emissiveColor.Green += 0.2f;
                }
                if (!нужен_зелёный && (emissiveColor.Green > 0.0001f))
                {
                    emissiveColor.Green -= 0.2f;
                }
                base._meshMaterials[1].EmissiveColor = emissiveColor;
            }
            else if ((base._meshMaterials != null) && (base._meshMaterials.Length >= 4))
            {
                ColorValue value3 = base._meshMaterials[1].EmissiveColor;
                ColorValue value4 = base._meshMaterials[2].EmissiveColor;
                ColorValue value5 = base._meshMaterials[3].EmissiveColor;
                if (нужен_красный && (value3.Red < 1f))
                {
                    value3.Red += 0.2f;
                }
                if (!нужен_красный && (value3.Red > 0.0001f))
                {
                    value3.Red -= 0.2f;
                }
                if (нужен_жёлтый && (value4.Green < 1f))
                {
                    value4.Red += 0.2f;
                    value4.Green += 0.2f;
                }
                if (!нужен_жёлтый && (value4.Green > 0.0001f))
                {
                    value4.Red -= 0.2f;
                    value4.Green -= 0.2f;
                }
                if (нужен_зелёный && (value5.Green < 1f))
                {
                    value5.Green += 0.2f;
                }
                if (!нужен_зелёный && (value5.Green > 0.0001f))
                {
                    value5.Green -= 0.2f;
                }
                base._meshMaterials[1].EmissiveColor = value3;
                base._meshMaterials[2].EmissiveColor = value4;
                base._meshMaterials[3].EmissiveColor = value5;
            }
        }

        public string Filename
        {
            get
            {
                if (!this.стрелка)
                {
                    return "светофор.x";
                }
                return "светофор_стрелка.x";
            }
        }

        public int MatricesCount
        {
            get
            {
                Double3DPoint point = this.положение.Координаты - MyDirect3D.Camera_Position;
                if (point.модуль > 300.0)
                {
                    return 0;
                }
                return 1;
            }
        }

        public enum Стрелки
        {
            нет,
            вправо,
            прямо,
            влево,
            белая_вправо,
            белая_прямо,
            белая_влево,
            белая_прямо_вправо,
            белая_прямо_влево,
            Count
        }
    }
}

